home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork2.lzh / サンプル基礎編 / ダイアログ / DITEM.C < prev    next >
Text File  |  1994-03-10  |  10KB  |  280 lines

  1. /******************************************************************************
  2.  *    ditem.c:    ダイアログの処理関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <console.h>        /* コンソール系マネージャを利用するときに必要 */
  7. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  8. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  9. #include <control.h>        /* コントロールマンを利用するときに必要    */
  10. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  11. #include <text.h>        /* テキストマンを利用するときに必要    */
  12. #include <task.h>        /* タスクマンを利用するときに必要    */
  13. #include "ditem.h"        /* このプログラム固有のヘッダファイル    */
  14.  
  15. /******************************************************************************
  16.  *    dialogProc():    ダイアログの作成、表示と各種処理
  17.  ******************************************************************************
  18.  *    引数:    ComVal *pcv    共通変数へのポインタ
  19.  *                = TRUE:  処理完了
  20.  *                = FALSE: 処理失敗
  21.  *    戻り値:    int num        終了したダイアログアイテムの番号
  22.  *                = 1: [設定]ボタン
  23.  *                = 2: [取消]ボタン
  24.  *                < 0: 処理失敗
  25.  */
  26. int dialogProc(ComVal *pcv)
  27. {
  28.     int num;            /* ダイアログのアイテム番号    */
  29.     int radBtn;            /* ラジオボタンの現在の状態    */
  30.     int chkBox;            /* チェックボックスの現在の状態    */
  31.     int lastBC;
  32.     Rect rc;
  33.     Handle dIListHdl;
  34.     Graph *lastGraph;
  35.     Dialog dialog;            /* ダイアログレコード        */
  36.     Dialog *dialogPtr = &dialog;    /* ダイアログポインタ(疑似ポインタ)*/
  37.  
  38.     /* ダイアログの表示位置 */
  39.     static Rect dlgPos = { DLG_X, DLG_Y, DLG_X + DLG_H, DLG_Y + DLG_V };
  40.  
  41.     static short funcKeyTbl[] = {    /* ファンクションキーアサインテーブル */
  42.         K_HOME,  0,        /* [HOME]    */
  43.         K_DEL,   0x07,        /* [DEL]    */
  44.         K_RUP,   0x03,        /* [ROLL UP]    */
  45.         K_RDOWN, 0x12,        /* [ROLL DOWN]    */
  46.         K_UNDO,  0,        /* [UNDO]    */
  47.         K_LEFT,  0x13,        /* [←]        */
  48.         K_UP,    0x05,        /* [↑]        */
  49.         K_RIGHT, 0x04,        /* [→]        */
  50.         K_DOWN,  0x18,        /* [↓]        */
  51.         K_CLR,   0,        /* [CLR]    */
  52.         K_HELP,  0,        /* [HELP]    */
  53.         K_INS,   0,        /* [INS]    */
  54.         0, 0            /* テーブル終端    */
  55.     };
  56.  
  57.     /* ダイアログアイテムのリソースを読み込む */
  58.     dIListHdl = TSRscGet('DITL', 128);
  59.     if (dIListHdl == NULL) {
  60.         pcv->errorCode = 14;    /* 読み込めなかった        */
  61.         return -1;        /* 失敗したので-1を返す    */
  62.     }
  63.  
  64.     TSAdjustRect(&rc, &dlgPos, 16);    /* ダイアログの表示位置を補正する */
  65.     dialogPtr = DMOpen(        /* ダイアログをオープンする    */
  66.         dialogPtr,        /* 用意したダイアログポインタ    */
  67.         &rc,            /* ダイアログの表示位置        */
  68.         NONTITLE,        /* タイトルは自分で描画する    */
  69.         FALSE,            /* オープン時に描画しない    */
  70.         WI_DLG << 4,        /* ダイアログウィンドウ        */
  71.         W_FRONT,        /* 一番手前に表示する        */
  72.         FALSE,            /* クローズボタンを使用しない    */
  73.         LONGWORD(1, TSGetID()),    /* 自分のタスクID        */
  74.         dIListHdl);        /* アイテムリストへのハンドル    */
  75.     if (dialogPtr == NULL) {
  76.         pcv->errorCode = 7;    /* 作成できなかった        */
  77.         return -1;        /* 失敗したので-1を返す    */
  78.     }
  79.     /* ファンクションキーアサインテーブルを設定する */
  80.     (*dialogPtr->tEdit)->funcCode = funcKeyTbl;
  81.     /* 編集可能テキストの文字列を設定する */
  82.     setDItemText(dialogPtr, 6, pcv->text);
  83.     radBtn = pcv->radBtn;        /* ラジオボタンの現在の状態を取得する */
  84.     /* 選択されているラジオボタンに1をセットする */
  85.     setDItemControl(dialogPtr, radBtn + 3, 1);
  86.     /* チェックボックスの現在の状態を取得する */
  87.     chkBox = pcv->chkBox;
  88.     if (chkBox == 1)        /* チェック状態か?        */
  89.         /* チェックボックスに1をセットする */
  90.         setDItemControl(dialogPtr, 5, 1);
  91.  
  92.     WMShow(&dialogPtr->window);    /* ダイアログを表示する        */
  93.     /* ダイアログをカレントグラフにする */
  94.     lastGraph = GMExgGraph(&dialogPtr->window.graph);
  95.  
  96.     /* タイトルを描画する */
  97.     GMShadowStrZ("ダイアログアイテム", LONGWORD((DLG_H - 9 * 12) / 2, 4));
  98.     GMShadowStrZ("ラジオボタン",       LONGWORD(30,  39));
  99.     GMShadowStrZ("チェックボックス",   LONGWORD(50,  73));
  100.     GMShadowStrZ("文字ボタン",         LONGWORD(60, 145));
  101.     lastBC = GMBackColor(G_WHITE);    /* バックグラウンドカラーを白にする */
  102.     DMDraw(dialogPtr);        /* すべてのアイテムを描画する    */
  103.  
  104.     while (1) {
  105.         /* 帰還属性を持つアイテムが押されるまで、アイテムの各種処理を
  106.            システムに任せて、押されたアイテムの番号を取得する */
  107.         num = DMControl(filterProc);
  108.         switch (num) {
  109.         case 1:            /* [設定]ボタン            */
  110.         case 2:            /* [取消]ボタン            */
  111.             break;
  112.         case 3:            /* ラジオボタン            */
  113.         case 4:
  114.             radBtn = num - 3;
  115.             /* 押されたラジオボタンに1をセットする */
  116.             setDItemControl(dialogPtr, num, 1);
  117.             /* 押されていないラジオボタンに0をセットする */
  118.             setDItemControl(dialogPtr, 7 - num, 0);
  119.             break;
  120.         case 5:            /* チェックボックス        */
  121.             /* チェックボックスの現在値を得て反転する */
  122.             chkBox = getDItemControl(dialogPtr, num) ^ 1;
  123.             setDItemControl(dialogPtr, num, chkBox);
  124.             break;
  125.         }
  126.         if (num == 1) {
  127.             /* [設定]ボタンが押されたなら、ラジオボタンとチェック
  128.                ボックスの状態、編集可能テキストの内容を保存する */
  129.             pcv->radBtn = radBtn;
  130.             pcv->chkBox = chkBox;
  131.             /* 編集可能テキストの文字列を取得する */
  132.             getDItemText(dialogPtr, 6, pcv->text);
  133.             break;
  134.         } else if (num == 2)
  135.             break;
  136.     }
  137.     GMBackColor(lastBC);        /* バックグラウンドカラーを元に戻す */
  138.     DMClose(dialogPtr);        /* ダイアログをクローズする    */
  139.     GMSetGraph(lastGraph);        /* カレントグラフを元に戻す    */
  140.  
  141.     /* 処理が完了したのでアイテム番号を返す */
  142.     return num;
  143. }
  144.  
  145. /******************************************************************************
  146.  *    filterProc():    ダイアログのフィルタ関数
  147.  ******************************************************************************
  148.  *    引数:    Dialog *dlgPtr    ダイアログポインタ
  149.  *        Event *pev    イベントレコードへのポインタ
  150.  *    戻り値:    int        終了コード(ここでは、常に0)
  151.  *    注釈:
  152.  *    DMControl()から呼び出され、カーソルの点滅処理と、リターンキー/ESCキー
  153.  *    の入力を[設定]/[取消]ボタンのマウス左ダウンイベントに変換する処理を行う。
  154.  */
  155. int filterProc(Dialog *dlgPtr, Event *pev)
  156. {
  157.     int keyCode;            /* キーコード            */
  158.     int num = 0;            /* ダイアログのアイテム番号    */
  159.     short type;
  160.     Rect rc;
  161.     Handle item;
  162.  
  163.     /* ダイアログをカレントグラフにする */
  164.     GMSetGraph(&dlgPtr->window.graph);
  165.  
  166.     switch (pev->what) {        /* イベントの種類は?        */
  167.     case E_IDLE:            /* アイドルイベント        */
  168.         TMIdle(dlgPtr->tEdit);    /* カーソルを点滅させる        */
  169.         break;
  170.     case E_KEYDOWN:            /* キーダウンイベント        */
  171.         /* キーコードをファンクションキーアサインテーブルで変換する */
  172.         keyCode = TMKeyToAsk(dlgPtr->tEdit, (TsEvent *) pev);
  173.         /* キーコードがあるか? */
  174.         if (keyCode != -1 && keyCode != 0) {
  175.             switch (pev->whom.key.ascii) {
  176.             case '\r':    /* リターンキーかENTERキー    */
  177.                 num = 1; /* [設定]ボタン        */
  178.                 break;
  179.             case '\x1b':    /* ESCキー            */
  180.                 num = 2; /* [取消]ボタン        */
  181.                 break;
  182.             }
  183.             if (num != 0) {
  184.                 /* 指定アイテムのレクタングル内を指す座標を
  185.                    作成する */
  186.                 DIGet(dlgPtr, num, &type, &item, &rc);
  187.                 /* 縦横4ドットだけ内側へ移動する */
  188.                 rc.d.left += 4;
  189.                 rc.d.top += 4;
  190.                 /* グローバル座標系に変換する */
  191.                 pev->where.x_y = GMLocalToGlobal(rc.l.l_t);
  192.                 /* イベントをマウス左ダウンイベントにする */
  193.                 pev->what = E_MSLDOWN;
  194.             }
  195.         }
  196.         break;
  197.     case E_UPDATE:            /* アップデートイベント        */
  198.         /* カーソルを点滅させるために、アップデート処理を行う */
  199.         WMUpdate(&dlgPtr->window); /* アップデートを開始する    */
  200.         WMUpdtOver(&dlgPtr->window); /* アップデートを終了する    */
  201.         break;
  202.     }
  203.     return 0;
  204. }
  205.  
  206. /******************************************************************************
  207.  *    setDItemControl():    ダイアログアイテムのコントロールへの値の設定
  208.  ******************************************************************************
  209.  *    引数:    Dialog *dlgPtr    ダイアログポインタ
  210.  *        int num        ダイアログのアイテム番号
  211.  *        int val        設定する値
  212.  */
  213. void setDItemControl(Dialog *dlgPtr, int num, int val)
  214. {
  215.     short type;
  216.     Rect rc;
  217.     Handle item;
  218.  
  219.     /* ダイアログアイテムのハンドルを取得する */
  220.     DIGet(dlgPtr, num, &type, &item, &rc);
  221.     /* コントロールに値を設定する */
  222.     CMValueSet((Control **) item, val);
  223. }
  224.  
  225. /******************************************************************************
  226.  *    getDItemControl():    ダイアログアイテムのコントロールの現在値の取得
  227.  ******************************************************************************
  228.  *    引数:    Dialog *dlgPtr    ダイアログポインタ
  229.  *        int num        ダイアログのアイテム番号
  230.  *        int *val    値を格納するポインタ
  231.  */
  232. int getDItemControl(Dialog *dlgPtr, int num)
  233. {
  234.     short type;
  235.     Rect rc;
  236.     Handle item;
  237.  
  238.     /* ダイアログアイテムのハンドルを取得する */
  239.     DIGet(dlgPtr, num, &type, &item, &rc);
  240.     /* コントロールの現在値を返す */
  241.     return CMValueGet((Control **) item);
  242. }
  243.  
  244. /******************************************************************************
  245.  *    setDItemText():    ダイアログアイテムの編集可能テキストへの文字列の設定
  246.  ******************************************************************************
  247.  *    引数:    Dialog *dlgPtr    ダイアログポインタ
  248.  *        int num        ダイアログのアイテム番号
  249.  *        _LASCII str    設定するLASCII型文字列
  250.  */
  251. void setDItemText(Dialog *dlgPtr, int num, _LASCII str)
  252. {
  253.     short type;
  254.     Rect rc;
  255.     Handle item;
  256.  
  257.     /* ダイアログアイテムのハンドルを取得する */
  258.     DIGet(dlgPtr, num, &type, &item, &rc);
  259.     DITSet(type, item, str);    /* 編集可能テキストに文字列を設定する */
  260. }
  261.  
  262. /******************************************************************************
  263.  *    getDItemText():    ダイアログアイテムの編集可能テキストの文字列の取得
  264.  ******************************************************************************
  265.  *    引数:    Dialog *dlgPtr    ダイアログポインタ
  266.  *        int num        ダイアログのアイテム番号
  267.  *        _LASCII str    LASCII型文字列を格納するポインタ
  268.  */
  269. void getDItemText(Dialog *dlgPtr, int num, _LASCII str)
  270. {
  271.     short type;
  272.     Rect rc;
  273.     Handle item;
  274.  
  275.     /* ダイアログアイテムのハンドルを取得する */
  276.     DIGet(dlgPtr, num, &type, &item, &rc);
  277.     DITGet(type, item, str);    /* 編集可能テキストの文字列を取得する */
  278.     str[str[0] + 1] = 0;        /* 文字列の最後に0を付加する    */
  279. }
  280.